<?php
/**
 * 函数集
 * 
 * @package util.core
 * @since 0.2.1
 */

/**
 * 根据类名称自动加载类
 * 
 * 由系统自动调用.只在class-path中寻找需要的类.如果在class-path中有多个名称一样的类，则查找到第一个时，就会停止继续查找。
 * 
 * 建议使用import手工导入可能有重复命名的类，由此获得更好的可扩展性.
 *
 * @param string $className 类名称
 */
function classAutoload($className) {
	if (class_exists($className, false)) {
		return;
	}
	if (native::loadCachedClass($className)) {
		return;
	}
	$classPath = IConfig::getClassPath();
	$className = str_replace(".", "/", $className);
	foreach ($classPath as $path) {
		if (!native::isAbsolutePath($path) && $path != ".") {
			$dirname = IFRAMEWORK_APP_ROOT . "/" . $path;
		}
		else {
			$dirname = $path;
		}
		if (is_dir($dirname)) {
			$filename = $dirname . "/" . $className . ".php";
			if (is_file($filename)) {
				native::load($className, $filename);
				return;
			}
		}
		else if (is_file($dirname) && basename($dirname) == $className . ".php") {
			native::load($className, $dirname);
			return;
		}
	}
	throw new Exception("can't find class named '{$className}' in class-paths below: <br/>\n&nbsp; &nbsp; " . implode(",<br/>\n&nbsp; &nbsp; ", $classPath));
}

/**
 * 根据类名称加载类
 * 
 * 如果一个类在application.conf.php中定义的class-path或toolkit下，只需要指定包名+类名即可引入.这要求类文件的命名必须和类名称一致，比如A类应该放在A.php中，否则将会提示无法找到所需的类.
 * 
 * 该函数并非总能成功找到所需的类，有时需要手工使用class_exists($className, false)检查是否加载成功。
 * 
 * 导入一个类的时候，类所在的包所在目录将会被自动添加到class-path中.
 * <code>
 * import("sqlmap.*");
 * import("sqlmap.element.*");
 * </code>
 * 
 * 从0.0.3开始，可以导入相对于当前目录的类，比如对于
 * <pre>
 * /a
 *    /b
 *       ExampleClass.php
 * /use.php
 * </pre>
 * 可以在 use.php 中使用 import("a.b.ExampleClass"); 导入ExampleClass类。
 *
 * @param string $className 类名称
 */
function import($className) {
	$classPath = native::loadCachedClass($className);
	if ($classPath != null) {
		IConfig::addClassPath(dirname($classPath));
		return;	
	}
	if (gettype($className) != "string") {
		return;
	}
	if (class_exists(native::getRealClassName($className), false)) {
		return;
	}
	$classPaths = IConfig::getClassPath();
	foreach ($classPaths as $directory) {
		if (!native::isAbsolutePath($directory) && $directory != ".") {
			$directory = IFRAMEWORK_APP_ROOT . "/" . $directory;
		}
		$classPath = $directory . "/" . str_replace(".", "/", $className) . ".php";
		IConfig::addClassPath(dirname($classPath));	
		$files = glob($classPath);
		if (!empty($files)) {
			native::load($className, $files);
		}
	}
}


?>